#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"
#include "bitset"

using namespace std;

/*
 *给你一个整数 n ，对于 0 <= i <= n 中的每个 i ，计算其二进制表示中 1 的个数 ，返回一个长度为 n + 1 的数组 ans 作为答案。



示例 1：

输入：n = 2
输出：[0,1,1]
解释：
0 --> 0
1 --> 1
2 --> 10
示例 2：

输入：n = 5
输出：[0,1,1,2,1,2]
解释：
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
 *
 *
 * */


vector<int> countBits(int n) {
    bitset<32> b(0xFFFFFFFF);

    vector<int> ret;


    for (int i = 0; i <= n; ++i) {
        bitset<32> t(i);
        int count = 0;
        for (int j = 0; j < 32; ++j) {
            if (b[j] == t[j] && t[j] == 1) {
                ++count;
            }

        }
        ret.push_back(count);
    }


    return ret;
}

//=x & (x−1)，该运算将 xxx 的二进制表示的最后一个 111 变成 000。因此，对 xxx 重复该操作，直到 xxx 变成 000，则操作次数即为 xxx 的「一比特数」

int countOnes(int x) {
    int ones = 0;
    while (x > 0) {
        x &= (x - 1);//每次把最后一个一给移除了
        ++ones;
    }


    return ones;
}

vector<int> countBits1(int n) {
    vector<int> bits(n + 1);
    for (int i = 0; i <= n; i++) {
        bits[i] = countOnes(i);
    }
    return bits;
}


